#include <stdio.h>  
#include <stdlib.h>  
  
// 定义单链表节点结构体  
struct ListNode {  
    int val;           // 节点存储的值  
    struct ListNode *next;  // 指向下一个节的指针  
};  
  
// 初始化单链表  
void initList(struct ListNode **headRef) {  
    *headRef = NULL;  // 将头指针置为空  
}  
  
// 依次采用尾插法插入元素a,b,c,d,e  
void insertList(struct ListNode **headRef, int val) {  
    struct ListNode *newNode = (struct ListNode*)malloc(sizeof(struct ListNode));  // 创建新节点  
    newNode->val = val;  // 设置节点的值  
    newNode->next = NULL;  // 将节点的指针置为空  
  
    if (*headRef == NULL) {  // 如果链表为空，将新节点设为头节点  
        *headRef = newNode;  
    } else {  // 否则，遍历链表找到尾节点，将新节点插入到尾部  
        struct ListNode *tail = *headRef;  
        while (tail->next != NULL) {  // 遍历链表找到尾节点  
            tail = tail->next;  
        }  
        tail->next = newNode;  // 将新节点插入到尾部  
    }  
}  

  
// 输出单链表h  
void printList(struct ListNode *head) {  
    printf("[ ");  // 打印左括号和空格  
    while (head != NULL) {  // 遍历链表，输出每个节点的值  
        printf("%d ", head->val);  
        head = head->next;  // 移动到下一个节点  
    }  
    printf("]\n");  // 打印右括号和换行符  
}  
  
// 输出单链表h的长度  
int getLength(struct ListNode *head) {  
    int length = 0;  // 初始化长度为0  
    while (head != NULL) {  // 遍历链表，累加节点的数量  
        length++;  
        head = head->next;  // 移动到下一个节点  
    }  
    return length;  // 返回链表的长度  
}  
  
// 判断单链表h是否为空  
int isEmpty(struct ListNode *head) {  
    return head == NULL;  // 如果链表头指针为空，则链表为空，返回1，否则返回0  
}  
  
// 输出单链表h的第三个元素  
int getThirdElement(struct ListNode *head) {  
    if (head == NULL || head->next == NULL || head->next->next == NULL) {  // 如果链表为空或只有一个节点或只有两个节点，则无法输出第三个元素，返回-1  
        return -1;  
    } else {  // 否则，遍历链表找到第三个节点，返回其值  
        struct ListNode *third = head;  
        for (int i = 0; i < 2; i++) {  // 移动到第三个节点，注意这里使用了for循环而不是while循环，因为for循环可以更简洁地完成这个任务，而while循环需要使用计数器变量和break语句才能完成这个任务。当然，使用while循环也是可以的。  
            third = third->next;  // 移动到下一个节点  
        }  
        return third->val;  // 返回第三个节点的值  
    }  
}  
  
// 输出元素a的位置  
int getElementAtIndex(struct ListNode *head, int index) {  
    if (head == NULL || index < 0 || index >= getLength(head)) {  // 如果链表为空或索引无效，则返回-1表示无法找到元素。注意这里使用了getLength函数来获取链表的长度，这样可以避免不必要的重复计算。当然，你也可以手动计算链表的长度。  
            return -1;}
}